From 0add6268224e705f6e3f8f26289846e046098a81 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Aug 2020 13:54:06 -0400 Subject: [PATCH] textbuffer: Be careful with tags when copying We can only insert tags in the buffer if they come from the same GtkTextTagTable as the buffer uses. If that is not the case, paste the text without tags. Fixes: #2991 --- gtk/gtktextbuffer.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c index 3e7e12c0fa..1f616bdce1 100644 --- a/gtk/gtktextbuffer.c +++ b/gtk/gtktextbuffer.c @@ -1605,15 +1605,15 @@ insert_range_not_inside_self (GtkTextBuffer *buffer, GtkTextIter end = *orig_end; GtkTextIter range_start; GtkTextIter range_end; - + if (gtk_text_iter_equal (orig_start, orig_end)) return; - + gtk_text_iter_order (&start, &end); range_start = start; - range_end = start; - + range_end = start; + while (TRUE) { int start_offset; @@ -1621,12 +1621,12 @@ insert_range_not_inside_self (GtkTextBuffer *buffer, GSList *tags; GSList *tmp_list; Range *r; - + if (gtk_text_iter_equal (&range_start, &end)) break; /* All done */ g_assert (gtk_text_iter_compare (&range_start, &end) < 0); - + gtk_text_iter_forward_to_tag_toggle (&range_end, NULL); g_assert (!gtk_text_iter_equal (&range_start, &range_end)); @@ -1634,33 +1634,32 @@ insert_range_not_inside_self (GtkTextBuffer *buffer, /* Clamp to the end iterator */ if (gtk_text_iter_compare (&range_end, &end) > 0) range_end = end; - + /* We have a range with unique tags; insert it, and * apply all tags. */ start_offset = gtk_text_iter_get_offset (iter); r = save_range (&range_start, &range_end, &end); - + insert_range_untagged (buffer, iter, &range_start, &range_end, interactive); restore_range (r); r = NULL; - - gtk_text_buffer_get_iter_at_offset (buffer, &start_iter, start_offset); - - tags = gtk_text_iter_get_tags (&range_start); - tmp_list = tags; - while (tmp_list != NULL) + + if (gtk_text_buffer_get_tag_table (gtk_text_iter_get_buffer (orig_start)) == gtk_text_buffer_get_tag_table (buffer)) { - gtk_text_buffer_apply_tag (buffer, - tmp_list->data, - &start_iter, - iter); + gtk_text_buffer_get_iter_at_offset (buffer, &start_iter, start_offset); - tmp_list = tmp_list->next; + tags = gtk_text_iter_get_tags (&range_start); + tmp_list = tags; + while (tmp_list != NULL) + { + gtk_text_buffer_apply_tag (buffer, tmp_list->data, &start_iter, iter); + tmp_list = tmp_list->next; + } + g_slist_free (tags); } - g_slist_free (tags); range_start = range_end; } -- 2.30.2